#pragma once
#include <iostream>
#include <string>
#include <unordered_map>
#include <fstream>
#include "Log.hpp"
using namespace std;

namespace dict_ns
{
    const string sep = ": ";                 // 配置文件中的分隔符
    const string defaultpath = "./Dict.txt"; // 配置文件路径
    // 字典类
    class Dict
    {
    private:
        // 录入，将配置文件中的信息录入到KV容器中
        bool Load()
        {
            // 先打开这个配置文件
            ifstream in(_dict_conf_filepath);
            if (!in.is_open()) // 打开文件失败
            {
                // 写日志
                LOG(FATAL, "打开%s文件失败\n", _dict_conf_filepath.c_str());
                return false;
            }
            // 打开文件成功
            string line; // 读取配置文件信息缓冲区
            while (getline(in, line))
            {
                // 防止配置文件中出现空行，出现空行直接continue
                if (line.empty())
                {
                    continue;
                }
                // line读取一行信息，在这一行信息中按照分隔符去查找，返回这个分隔符的下标，最左侧下标
                int pos = line.find(sep);
                // 如果没有找到这个分隔符，所名此行非法，跳过即可
                if (pos == string::npos) // npos就是-1，查找下标返回-1，说明没有找到
                {
                    continue;
                }
                // 提取单词部分和中文部分
                // 提取单词部分
                string word = line.substr(0, pos);
                if (word.empty()) // 如果提取的单词部分为空，就跳过
                {
                    continue;
                }
                // 提取汉语部分
                string han = line.substr(pos + sep.size(), line.size());
                if (han.empty()) // 如果汉语部分为空，也直接跳过
                {
                    continue;
                }
                LOG(DEBUG, "插入的信息->英文:%s  中文:%s\n", word.c_str(), han.c_str());
                // 将单词部分和汉语部分作为一对键值对，插入到KV容器中
                _dict.insert(make_pair(word, han));
            }
            // 关闭文件
            in.close();
            LOG(DEBUG, "加载配置文件%s成功\n", _dict_conf_filepath.c_str());
            return true;
        }

    public:
        Dict(const string &path = defaultpath)
            : _dict_conf_filepath(path) // 初始化配置文件
        {
            // 加载配置文件中的信息到KV容器中
            Load();
        }
        // 翻译---将word英文单词翻译为中文并返回该中文
        string Translate(const string &word, bool &ok)
        {
            ok = true; // ok表示结果是否是可信的
            // 翻译操作就是用word的Key值在_dict字典中去查找
            auto iter = _dict.find(word);
            // 如果没找到，就返回空串
            if (iter == _dict.end())
            {
                ok = false;
                return "未找到";
            }
            // return _dict[word];
            return iter->second;
        }
        ~Dict() {}

    private:
        unordered_map<string, string> _dict; // KV容器
        string _dict_conf_filepath;          // 配置文件
    };
}